/**
 * @projectDescription	Client programm for messages exchange via ICQ 
 * @author 		Alexey MAGician Sergeev 
 * @version 	1.1.0
 */

var defaultTemplate = {
		contactStatusClass		: 'cl-contactlist-status',
		contactStatusIconClass	: 'cl-statusicon',
		contactNameClass		: 'cl-contactlist-name ui-helper-reset',
		contactClass			: 'cl-contactlist-contact ui-helper-reset',
		contactTemplate 		: '<div contact_id={id} type_="cl-contact"><div type_="cl-contact-status" title=""></div><div type_="cl-contact-name">{name}</div></div>',
		
		panelClass		: 'ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide',
		tabClass		: 'ui-state-default ui-corner-top',
		tabStatusClass	: 'ui-tabs-status cl-statusicon',
		panelTemplate	: '<div id="_{id}"></div>',
		tabTemplate		: '<li contact_id="{id}" type_="cl-contact-tab"><div type_="cl-contact-status" title=""></div><a href_id="#_{id}" style="cursor: pointer;">{label}</a><a class="ui-tabs-close" href_id="#_{id}" style="cursor: pointer;">X</a></li>',
			
		statusTemplate	: '<div style="float: left;width:100%;cursor: default;"><div type_="cl-user-status"></div><div type_="cl-user-status-name">{name}</div></div>' 
		};

var protocols = {
		icq : 1,
		mrim: 2
};

/**
 * Без этой глобальной переменной никак... =(
 * @type Object
 */ 
var mainMessagesWindow = undefined;
/**
 * А без этой крайне сложно...
 * @type Object
 */  
var mousePosition = undefined;

/**
 * Возвращает строку содержащую текщую дату
 *
 * @param 	showdate bool
 * @param	showtime bool
 * @param	format12 bool
 * @return 	string
 * @type	string
 */
function GetCurrentDate(showdate, showtime, format12) {
	if (format12 == undefined) {format12 = false;};
	if (showdate == undefined) {showdate = true;};
	if (showtime == undefined) {showtime = true;};
	
	var all=new Date();
	var datevalue = "";
	if (showdate) {
		datevalue = all.getDate() + "/" + (all.getMonth()+1) + "/" + all.getFullYear();
	} 
	
	var hours	= all.getHours();
	var minutes	= all.getMinutes();
	var seconds	= all.getSeconds();
	
	var timevalue = ""; 
	if (showtime) {
		timevalue = ((format12) ? ((hours>12) ? hours-12 : hours) : hours);
		timevalue+= ((minutes<10) ? ":0" : ":") + minutes;
		timevalue+= ((seconds<10) ? ":0" : ":") + seconds;
		if (format12) {
			timevalue+= " ";
			timevalue+= (hours>=12) ? "P.M." : "A.M.";
		}
	}
	
	return datevalue + ((showdate && showtime) ? " " : "") + timevalue;
};


/**
 * Добавляет сообщение в окно лога
 */ 
function AddLogMessage(message, status) {
	var logArea = $('#LogArea');
	var newLogMess = $('<div class="log_message">');
	newLogMess.html('<span class="log_date">&lt;' + GetCurrentDate(false) + '&gt;</span> ' + $('<div>').text(message).html()).css("color", ((status==undefined)? "#000" : "#F00")).appendTo(logArea);
	newLogMess.hover(function(){$(this).toggleClass("log_message_active");},function(){$(this).toggleClass("log_message_active");});
	newLogMess[0].scrollIntoView(false);
}

/**
 * Класс стилей
 * @constructor
 */ 
function COutputStyles (parentClass) 
{
	var thisOutputStyles = this;
	var parentClass = parentClass;
	
	var stylesvalues = {
		contactnamecolor 	: "#00F",
		usernamecolor 		: "#F00",
		messagecolor 		: "#000"};

	/**
	 * Конструктор класса
	 */
	this.__COutputStyles = function () 
	{
	};
	/**
	 * @return Возвращает значене параметра стиля
	 * @param {string} fieldName
	 * @type string  
	 */
	this.getValue = function(fieldName) 
	{
		return stylesvalues[fieldName.toLowerCase()];
	};
	/**
	 * Устанавливает значение параметра стиля
	 * @param {string} fieldName
	 * @param {string} fieldValue
	 */
	this.setValue = function(fieldName, fieldValue) {	
		stylesvalues[fieldName.toLowerCase()] = fieldValue;
	};
	
	// Вызов конструктора
	this.__COutputStyles();
}

/**
 * Класс контекстного меню
 * @constructor
 */
function CContactMenu(parentClass, UIN) {
	var thisContactMenu = this;
	var parentClass 	= parentClass;
	var mainDiv			= undefined;
	var title			= undefined;
	var menupos			= undefined;

	/**
	 * Конструктор класса
	 */
	this.__CContactMenu = function()
	{
		mainDiv = $('<div class="contactMenu_mainWin"></div>').hide();
		title 	= $('<div class="contactMenu_title">Context menu</div>').appendTo(mainDiv);
		menupos = $('<ul class="contactMenu_items"><li>111</li><li>222</li><li>333</li><li>111</li><li>222</li><li>333</li></ul>').appendTo(mainDiv);
		
		$("li", menupos).addClass("contactMenu_item").hover(
			function() {$(this).toggleClass("contactMenu_hover");},
			function() {$(this).toggleClass("contactMenu_hover");}	
		);
	
		$("li", menupos).click(
				function() {
					alert($(this).text());
					}
				);
		
		$(document).bind('click', thisContactMenu.hideThisMenu);
	};
	/**
	 * @return Возвращает объект контекстного меню
	 * @type jquery
	 */
	this.getContactMenuWin = function() 
	{
		return mainDiv; 
	};
	/**
	 * Скрывает контекстное меню
	 */
	this.hideThisMenu = function() 
	{
		mainDiv.fadeOut(200);
	};
	// Инициализация класса
	this.__CContactMenu();
}; // CContactMenu

/**
 * Класс области ввода сообщения
 * 
 * @param UIN string
 * @param ParentObject CTabsWindow
 */
function CChatArea(UIN, ParentObject) 
{
	var ThisChatClass = this;
	var WinNum        = UIN;
	/**
	 * @type CTabsWindow
	 */
	var ParentObject  = ParentObject;
	// Визуальные объекты
	var maindiv 	= undefined;
	var textdiv 	= undefined;
	var textarea 	= undefined;
	
	/**
	 * Конструктор класса
	 */
	this.__CChatArea = function ()
	{
		maindiv = $('<div style="position: absolute;width:100%;height: 100%;">');
		textdiv = $('<div class="chatArea_UserMessageText">').appendTo(maindiv);
		textarea = $('<textarea class="chatArea_UserMessageText1" rows="1" cols="50"></textarea>').text("Test it! " + UIN).appendTo(textdiv);
		// onkeypress="onkeypress_event(event)"
	
		button = $('<button type="submit" class="chatArea_ButtonSend">Отправить</button>').
				click( function() {ParentObject.addMessage();}).
				appendTo(maindiv);
	};
	/**
	 * @return Текст сообщения пользователя (из поля ввода)
	 * @type string
	 */	
	this.getMessageText = function() 
	{
		return textarea.attr("value"); 
	};
	/**
	 * Устанавливает теест сообщения пользователя
	 */
	this.setMessageText = function(messageText) 
	{
		textarea.attr("value", messageText);
	};
	/**
	 * Устанавливает фокус на поле ввода
	 */
	this.ActivateInputArea = function() 
	{
		textarea.focus();
	};
	/**
	 * @return Объект окна области ввода
	 * @type jquery
	 */
	this.GetChatTableWin = function() 
	{
		return maindiv;
	};
	
	// Инициализация класса
	this.__CChatArea();
	
}; // CChatArea

// ** Класс сообщения
// @parentClass	CContactChatWindow
// @from		int 
// @message		str
function CMessage(parentClass, contact, message) {
	var parentClass = parentClass;
	var outputStyles = parentClass.getOutputStyles(); 
	// Возвращает класс стилей отображения
	this.getOutputStyles = function() {
		return outputStyles;
	};
	
	var mainDiv = $("<div class='chatArea_message'>"); //</div>
	var contactInfo = $("<div class='chatArea_userUIN'>").text(contact.getContactName()).appendTo(mainDiv);
	var messageText = $("<div class='chatArea_message_text'></div>").text(message).appendTo(mainDiv);
	
	// Заменим перевод строки и псевдотеги смайликов на HTML коды  
	message = messageText.html();
	message = message.replace(/\n/g, "<BR>");
	message = message.replace(/\[smile_image src="(.*?)" txt="(.*?)"\]/g, "<span title='$2'><img src='$1'></span>");
	messageText.html(message);

	contactInfo.css('color', (contact.isUserProfile()) ? outputStyles.getValue("usernamecolor") : outputStyles.getValue("contactnamecolor"));
	messageText.css('color', outputStyles.getValue("messagecolor"));
	
	mainDiv.hover(
		function(){
			$(this).addClass("chatArea_message_active");
		},
		function(){
			$(this).removeClass("chatArea_message_active");
		}
	);
	
	// Возвращает окно сообщения
	this.getMessageWin = function() {
		return mainDiv; 
	};
}; // CMessage

function CTabsWindow(parentClass) 
{
	var thisTabsClass 	= this;
	var parentClass 	= parentClass;
	var contactList 	= parentClass.getContactList();
	var AJAXQuery 		= parentClass.getAJAXQuery();
	var outputStyles 	= parentClass.getOutputStyles(); 
	var blinkIsActive 	= false;
	
	var tabs 			= Array();
	var startPos 		= 20;
	var currentPos 		= startPos;

	var ChatInputHeight = 100;
	var messagesArray	= new Array();
	
	// Visual elemetnts
	var mainDiv 		= undefined;
	var scrollLeft 		= undefined;
	var scrollRight 	= undefined;
	
	
	this.__CTabsWindow = function() 
	{
		mainDiv = $("<div class='tab_background'></div>");
		
/*		// Кнопочки прокрутки вкладок
		scrollLeft = 
			$("<img src='images/button-right.PNG' style='position: absolute;right:0px;top:5px;z-index: 100;'></button>")
			.click(function() {thisTabsClass.scrollTabs(-50);})
			.hover(function() {$(scrollLeft).attr("src", "images/button-right_active.PNG");},
				   function() {$(scrollLeft).attr("src", "images/button-right.PNG");})		
			.appendTo(mainDiv);

		scrollRight = 
			$("<img src='images/button-left.PNG' style='position: absolute;left:0px;top:5px;z-index: 100;'></button>")
			.click(function() {thisTabsClass.scrollTabs(50);})
			.hover(
				function () {$(scrollRight).attr("src", "images/button-left_active.PNG");},
				function () {$(scrollRight).attr("src", "images/button-left.PNG");})		
			.appendTo(mainDiv); */
	};

	/**
	 * @return Возвращает класс стилей отображения
	 * @type object
	 */ 
	this.getOutputStyles = function() 
	{
		return outputStyles;
	};
	/**
	 * Создает новое сообщение
	 */ 
	this.createNewMessage = function(contactUIN, messageText, mode, messagesWindow) 
	{
		var newMessage = new CMessage(thisTabsClass, contactList.getContact(contactUIN), messageText);
		var messageWin = newMessage.getMessageWin();
		
		if (mode === 1) {
			messageWin.prependTo(messagesWindow);
		} else {
			messageWin.appendTo(messagesWindow);
		}
		
		messagesArray[messagesArray.length] = newMessage;
		messageWin[0].scrollIntoView(false);
		return newMessage; 
	};
	/**
	 * Отправка нового сообщения
	 */  
	this.addMessage = function() 
	{
		var messageText = ChatArea.getMessageText();
		thisTabsClass.createNewMessage(contactList.getUserProfileUIN(), messageText);
		AJAXQuery.addMessageForSend(UIN, messageText);
	};

	/**
	 * Вызывается при получении данных с сервера (заполнение нескольких последних сообщений)
	 */ 
	var ajaxHistoryMessagesReturn = function(xml, UIN) 
	{
		var newMessagesRes = $("messages_log[@uin=" + UIN + "] > message",xml);
		var currentElement = undefined;
		var tabNum = getTabNumByUIN(UIN);
		AddLogMessage('Ajax query return: ' + newMessagesRes.length + ' messages from history', ((tabNum == undefined) ? 1 : undefined));
		
		// Такой вкладки нет, возможно мы ее уже закрыли
		if (tabNum == undefined) {
			return;
		}
		
		// Отделим последние сообщения черточкой
		var oldMessagesSeparator = undefined;
		if ( newMessagesRes.length != 0 ) {
			oldMessagesSeparator = $('<hr class="charArea_oldMessagesSeparator">').prependTo(tabs[tabNum].messagesWindow);
		}
		for (var i=0; i<newMessagesRes.length; i++) {
			currentElement = newMessagesRes.eq(i);
			thisTabsClass.createNewMessage(currentElement.attr('uin'), currentElement.text(),1, tabs[tabNum].messagesWindow);
		}
		
		if (oldMessagesSeparator != undefined) {
			oldMessagesSeparator[0].scrollIntoView(false);
		}
	};
	/**
	 * @return Возвращает корректную позицию вкладки
	 * @type int
	 */ 	
	var getPosition = function (tabNum) 
	{
		var pos = currentPos;
		for (var i=0; i<tabs.length; i++) {
			if (tabNum == i) {
				return pos;
			}
			pos+= tabs[i].container.width() + 1;
		}
		return pos;
	};
	/**
	 * @return Возвращает номер вкладки по UIN'у
	 * @type int
	 */ 
	var getTabNumByUIN = function (UIN) 
	{
		for (var i=0; i<tabs.length; i++) {
			if (tabs[i].UIN == UIN) {
				return i;
			}
		}
		return undefined;
	};
	/**
	 * @return Объект окна
	 * @type jquery
	 */
	this.getTabsWin = function() 
	{
		return mainDiv;
	};
	/**
	 * Устанавливает начальное положение вкладок
	 */ 
	this.scrollTabs = function(newPos) 
	{
		var newCurrentPos = currentPos + newPos;

		if (newCurrentPos > startPos) {
			newCurrentPos = startPos;
		}
		if (((getPosition()+newPos+80) < mainDiv.width())&&(newPos<0)) {
			return undefined;
		} 	
	
		currentPos = newCurrentPos;
		this.resizeAllTabs(100);
	};
	/**
	 * Подгоняет положение вкладок при закрытии
	 */  
	this.resizeAllTabs = function(speed) 
	{
		var scrollSpeed = (speed == undefined) ? 400 : speed;  
		for (var i=0; i<tabs.length; i++) {
			tabs[i].container.animate({left:getPosition(i)+"px"}, scrollSpeed);
		}
	};
	/**
	 * Всякие обработчики для анимации и функционала кнопочек...
	 */
	var setTabProperties = function(tabObject, UIN) 
	{
		var TabContainer = tabObject.container; 
		var button_close = tabObject.button_close;
		
		// Переключение подсветка кнопки закрытия...  		
		button_close.hover(
			function () {
				$(button_close).attr("src", "images/close_active.PNG");
			},
			function () {
				$(button_close).attr("src", "images/close_not_active.PNG");
			}
		);

		// Подсветка вкладок
		TabContainer.hover(
			function () {
				if ($(TabContainer).attr("isBlinked") == 1) {
					return;
				} 
			
				if ($(TabContainer).attr("isActive") == 0) {
					$(TabContainer).addClass("tab_hover");
					$(button_close).show();
				}
			},
			function () {
				if ($(TabContainer).attr("isBlinked") == 1) {
					return;
				} 
			
				$(TabContainer).removeClass("tab_hover");
				if (($(TabContainer).attr("isActive") == 0)) {
					$(button_close).hide();
				}
			}
		);
		TabContainer.bind("onBlinkTimer", 
			function(event, binkMode) {
				if (binkMode == undefined) { // Нужно просто убрать что вкладки мигает
					TabContainer.attr("isBlinked", 0);
					TabContainer.removeClass("tab_active_newMessage");
					TabContainer.removeClass("tab_not_active_newMessage");
					return;
				} else {
					bl1 = binkMode; 
				}
			
				if ($(TabContainer).attr("isActive") == 1) {
					if (bl1) {
						TabContainer.addClass("tab_active_newMessage");
					} else {
						TabContainer.removeClass("tab_active_newMessage");
					}
				} else {
					if (bl1) {
						TabContainer.addClass("tab_not_active_newMessage");
					} else {
						TabContainer.removeClass("tab_not_active_newMessage");
					}
				}
			}
		);
		
		// обработчики...
		tabObject.text.click(function() {parentClass.activateWindow(UIN);});
		tabObject.button_close.click(function() {parentClass.closeWindow(UIN);});
	};
	/**
	 * Создает новую вкладку (самая важная функция)
	 */ 
	this.createNewTab = function(UIN) 
	{
/*		var tabNum = tabs.length;
		
		var TabContainer = $("<div class='tab_not_active'></div>").css("left", getPosition() + "px").attr("isActive", 0).appendTo(mainDiv);
		var status 	= $("<div class='tab_status'></div>").appendTo(TabContainer);
		// Приделываем статус к контакту
		contactList.getContactStatusPic(UIN).appendTo(status);
		var text	= $("<div class='tab_text'></div>").appendTo(TabContainer);
		var close 	= $("<div class='tab_close'></div>").appendTo(TabContainer);
		text.text(contactList.getContactName(UIN));
		
		var button_close = $("<img src='images/close_not_active.PNG' border=0>").hide().appendTo(close);
		
		// Chat area
		var mainChatAreaContainer	= $("<div class='chatArea_mainWindow'></div>"); //  id='"+UIN+"'
		
		var messagesWindow = $("<div class='chatArea_messagesWindow'></div>").css("bottom", ChatInputHeight+"px");
		var inputwin = $("<div class='chatArea_inputWindow'></div>").css("height", ChatInputHeight+"px");
		
		var ChatArea = new CChatArea(UIN, thisTabsClass);
		ChatArea.GetChatTableWin().appendTo(inputwin);
		
		messagesWindow.appendTo(mainChatAreaContainer);
		inputwin.appendTo(mainChatAreaContainer); 
		mainChatAreaContainer.appendTo($("#MainParentWin"));
		
		tabs[tabNum] = {UIN                   : UIN, 
						container             : TabContainer, 
						status                : status, 
						text                  : text, 
						close                 : close, 
						button_close          : button_close, 
						newMessages           : undefined,
						mainChatAreaContainer : mainChatAreaContainer,
						messagesWindow        : messagesWindow};

		setTabProperties(tabs[tabNum], UIN); */
		// Запрос нескольких последних сообщений контакта 
		AJAXQuery.MakeAJAXQuery("getContactHistory",{contactUIN:UIN},ajaxHistoryMessagesReturn, UIN); 
	};
	/**
	 * Активирует вкладку
	 */ 
	this.activateTab = function(UIN) 
	{
		var tabNum = getTabNumByUIN(UIN);

		if (tabs[tabNum].newMessages !== undefined) {
			tabs[tabNum].newMessages = false;
			tabs[tabNum].container.trigger("onBlinkTimer");
		};
		
		tabs[tabNum].container.addClass("tab_active");
		tabs[tabNum].container.attr("isActive", 1);
		tabs[tabNum].container.removeClass("tab_hover");
		tabs[tabNum].button_close.show();
		
		tabs[tabNum].mainChatAreaContainer.show();
		
	};
	/**
	 * Деактивирует вкладку
	 */ 
	this.deactivateTab = function(UIN) 
	{
		var tabNum = getTabNumByUIN(UIN);
		tabs[tabNum].container.removeClass("tab_active");
		tabs[tabNum].container.attr("isActive", 0);
		tabs[tabNum].button_close.hide();
		tabs[tabNum].container.trigger("onBlinkTimer");

		tabs[tabNum].mainChatAreaContainer.hide();
	};
	/**
	 * Закрывает вкладку
	 */ 
	this.closeTab = function(UIN) 
	{
		var tabNum = getTabNumByUIN(UIN);
		tabs[tabNum].container.fadeOut(400, function() {$(this).remove();});
		tabs.splice(tabNum,1);
		this.resizeAllTabs();
	};
	/**
	 * Режим: получено новое сообщение
	 */
	this.setNewMessages = function(UIN) 
	{
		var tabNum = getTabNumByUIN(UIN);
		tabs[tabNum].newMessages = true;
		tabs[tabNum].container.attr("isBlinked", 1);
	};
	/**
	 * Мигание вкладок
	 */
	this.blinkTabs = function() 
	{
		blinkIsActive = !blinkIsActive;
	
		for (var i=0; i<tabs.length; i++) {
			var currentTab = tabs[i];
			if (currentTab.newMessages) {
				currentTab.container.trigger("onBlinkTimer", blinkIsActive);
			};
		};
	};
	// Конструктор класса
	this.__CTabsWindow();
	
}; // CTabsWindow

/**
 * Основной класс оконных вкладок
 * 
 * TODO Переделать тут все нафиг, а то очень криво....
 */  
function CMainMessagesWindow() {
	var thisMainMessagesWindow = this;
	var allWindows = new Array();
	var currentActiveWindow = undefined;
	var mainParentWin = "#MainParentWin";
	var timerVaribleStr = "";
	var timerPeriod = 2000;

	// Создадим класс обмена обмена сообщениями CAJAX 	
	var AJAXQuery = new CAJAX(thisMainMessagesWindow);
	
	// Возвращает объект обмена с сервером. 
	this.getAJAXQuery = function() {
		return AJAXQuery;
	};
	
	// Создадим класс стилей
	var outputStyles = new COutputStyles(thisMainMessagesWindow);
	
	// Создадим класс статусов
	var statuses = new CStatuses(thisMainMessagesWindow);
	// Что-бы можно было обращаться напрямую к статусам
	this.statuses = statuses;
	
	// Создадим класс контакт листа
	var contactList = new CContactList(thisMainMessagesWindow);
	contactList.getContactListWin().appendTo($("#MainContactList"));
	
	// Что-бы можно было обращаться напрямую к контактлисту...
	this.contactList = contactList;

	// Возвращает объект контакт-листа	
	this.getContactList = function() {
		return contactList;
	};
	
	// Возвращает класс стилей отображения
	this.getOutputStyles = function() {
		return outputStyles;
	};
	
	// Создадим окно с закладками
	var tabs = new CTabsWindow(thisMainMessagesWindow);
	tabs.getTabsWin().appendTo($("#MainWinBar"));

	// Возвращает номер окна в массиве по UIN'у	
	function getWinNumByUIN(UIN) {
		for (var i=0; i<allWindows.length; i++) {
			if (allWindows[i].UIN == UIN) {
				return i;
			}
		}
		return undefined;
	}
	
	// Переключает текущее окно 
	this.activateWindow = function(UIN) {
		if (currentActiveWindow != undefined) {
			tabs.deactivateTab(currentActiveWindow);
			//allWindows[getWinNumByUIN(currentActiveWindow)].win.deactivateWindow();
		}
		
		//allWindows[getWinNumByUIN(UIN)].win.activateWindow();
		tabs.activateTab(UIN);
		currentActiveWindow = UIN;
	};

	// Создает окно сообщений
	this.createNewWindow = function(UIN, newMessages) {
		var win = getWinNumByUIN(UIN);
		
		newMessages = (newMessages == undefined) ? false : newMessages;
		// Такое окно уже есть		
		if (win != undefined) {
			if (newMessages) {
				tabs.setNewMessages(UIN);
			}	
		
			return win;
		}
	
		var newWinNumber = allWindows.length;
//		var newWindow = new CContactChatWindow(thisMainMessagesWindow, UIN, newWinNumber);
//		newWindow.getChatAreaWin().appendTo($(mainParentWin));
		
		tabs.createNewTab(UIN);
		//allWindows[newWinNumber] = {UIN: UIN, win: newWindow};
		allWindows[newWinNumber] = {UIN: UIN};
		
		if (currentActiveWindow == undefined) {
			this.activateWindow(UIN);
		}

		if (newMessages) {
			tabs.setNewMessages(UIN);
		}	
		
		return newWinNumber;
	};

	// Закрывает окно сообщения	
	this.closeWindow = function(UIN) {
		var WinNum = getWinNumByUIN(UIN);
		//alert(WinNum);
		if (UIN == currentActiveWindow) {
			if (allWindows.length == 1) {
				currentActiveWindow = undefined;
			} else {
				var NewWin = (WinNum == 0) ?  1 : (WinNum - 1);
				this.activateWindow(allWindows[NewWin].UIN); 
			} 
		}
		
		//allWindows[WinNum].win.getChatAreaWin().remove();
		tabs.closeTab(UIN);
		allWindows.splice(WinNum, 1);
	};
	
	this.newMessage = function(UIN, text) {
		var mess_winnum = this.createNewWindow(UIN, true);
		//getWinNumByUIN(currentActiveWindow) != mess_winnum
		//this.activateWindow(mess_winnum);
		allWindows[mess_winnum].win.createNewMessage(UIN, text);
	};

	this.BlinkTimer = function() {
		tabs.blinkTabs();
		setTimeout(timerVaribleStr, timerPeriod);
	};
	
	this.startBlinkTimer = function(str, per) {
		timerVaribleStr = str;
		timerPeriod = per;
		this.BlinkTimer();
	};
};

/*
 * Создает и активизирует необходимые окна
 */
function createWindows() {
	// Ширшина окон =)
	var winLogWidth = Math.round(($(document).width() - 280) * 0.4);
	var winChatWidth = Math.round(($(document).width() - 280) * 0.6);
	
	var allWinHeight = 350;
	//var allWinHeight = $(document).height()-20;

	$('<div id="LogArea" class="log_LogArea">')
		.appendTo("body")
		.dialog(
			{title	: "Лог",
			position: [winChatWidth+230, 10],
			width	: winLogWidth,
			height	: 350,
			buttons	: {
				"Очистить лог": function(){
					$('#LogArea > div').empty();
				}}
			}); 

	$('#DialogContactList')
		.show()
		.css(
        	{top: 10,
            left: winChatWidth+20,
            width: 200
            })
		.resizable(
        	{alsoResize	: "#DialogContactList div.cl-contactlist-panel",
        	minHeight	: 200,
        	minWidth	: 150,
        	resize		: function(Event, ui) 
        		{
        		}  
            })
		.draggable(				
        	{handle		: 'div.ui-dialog-titlebar',
        	stack		: { 
        		group : '#DialogContactList, #DialogContactList', 
        		min   : 1 },
        	containment : 'document',
			snap: false});
	
	$('#DialogContactList a.ui-dialog-titlebar-close')
		.click(
			function()
			{
				$("#DialogContactList").fadeOut();
    		});
	
	$('#DialogContactList *[@showOnlyOnline]')
		.click(
			function(){
				if ($(this).attr('showOnlyOnline') == '0') {
					$(this).attr('showOnlyOnline', '1');
					$(this).addClass('ui-state-highlight');
					$('#DialogContactList *[@isonline=0]').hide();
					
				} else {
					$(this).attr('showOnlyOnline', '0');
					$(this).removeClass('ui-state-highlight');
					$('#DialogContactList *[@isonline=0]').show();
				}
				return false;
			});

	$('#DialogContactList *.cl-user-status-button')
	.click(
		function(){
			
			var menuWin = $('#DialogContactList div.cl-user-status-menu');
			if (menuWin.is(':visible')) {
				menuWin.slideUp();
			}else{
				menuWin.slideDown();
			}
			
			return false;
		});
	
	$('#DialogContactList *.cl-user-status-menu')
		.click(
			function(){
				$(this).slideUp();
				return false;
			});

	$(this).click(
			function(){
				$('#DialogContactList div.cl-user-status-menu').slideUp();
			});

	//$("#ContactTabs > ul").tabs();
	
	updateTabs();
	createTab({id: 83984906,label: 'Test 1'});
	createTab({id: 112,label: 'Test 2'});
	createTab({id: 112,label: 'Test 2'});
	createTab({id: 112,label: 'Test 2'});
	createTab({id: 113,label: 'Test 3', showIt: true});
	
	$('#DialogChat')
		.show()
		.css(
	    	{top: 10,
	        left: 10,
	        width: winChatWidth
	        })
		.resizable(
	    	{alsoResize	: "#DialogChat div.ui-dialog-content, #DialogChat div.ui-tabs-panel[@isActive=1] div.cl-chat-messages",
	    	minHeight	: 300,
	    	minWidth	: 300,
	    	resize		: function(Event, ui) 
	    		{
	    			var activeTab  = $('div.cl-chat-messages', $('div.ui-tabs-panel[@isActive=1]', $('#DialogChat')));
	    			$('div.cl-chat-messages', $('div.ui-tabs-panel:not(div.ui-tabs-panel[@isActive=1])', $('#DialogChat')))
	    				.css('height', activeTab.css('height'))
	    				.css('width',  activeTab.css('width'));
	    		}  
	        })
		.draggable(				
	    	{handle		: 'div.ui-dialog-titlebar',
	    	stack		: { group: '#DialogContactList, #DialogContactList', min: 1 },
	    	containment	: 'document',
			snap		: false});
	
	
	$('#DialogContactList *[@type_=button], #DialogChat *[@type_=button]')
		.unbind('hover')
		.hover(
			function(){
				$(this).addClass('ui-state-hover');
			},
			function(){
				$(this).removeClass('ui-state-hover');
			});
	
	
	var loading = $('#loadingCl'),
		pLeft = $(document).scrollLeft(),
		pTop = $(document).scrollTop();
	pLeft += ($(window).width() - loading.outerWidth()) / 2;
	pTop += ($(window).height() - loading.outerHeight()) / 2;
	loading.css({top: pTop, left: pLeft});
	loading.show().draggable();
}

/**
 * Тут создаем классы и заставляем всю эту бадягу фунциклировать =)
 */
function documentReadyFunction() {
	if ($.browser.msie) {
		if ($.browser.version <= 6) { // C 7.0 еще будем пробовать как-нибудь бороться, а с этим ****** да-ж заморачиваться нехочу...
//			$("body").html("<H1>This version of client not work with IE 6.0!  <small>sorry... :'(</small></H1>");
//			return;
		}
	}
	
	$('<title>').text('Client [version 2.2 betta jQuery and jQuery UI]').appendTo($('head'));

	// Это для того что-бы всегда знать положение курсора мышки
	$(document).mousemove(function(e){mousePosition = e;});
	
	createWindows();
	
	mainMessagesWindow = new CMainMessagesWindow();
	mainMessagesWindow.getAJAXQuery().startTimer("mainMessagesWindow.getAJAXQuery()", 2000);
	mainMessagesWindow.startBlinkTimer("mainMessagesWindow.BlinkTimer()", 500);
	
	AddLogMessage('Client started.');
	if ($.browser.msie) {
		AddLogMessage('Work with IE not fully tested!',1);
	}
	
	$('#Loading').fadeOut();
};

// Тут закипает работа, грубо говоря void main()   =) 
$(document).ready(function() {documentReadyFunction();});
